Amazon Elasticsearch Serviceで検索を試したい
Elasticsearch Serviceで必要な検索パターンを満たせるかクエリの検証する機会がありました。 手っ取り早く検索できる環境を構築を目指します。また検証することがあるかもしれないのでサンプルデータ投入を含めた手順を残します。
- グローバルIPでの接続制限したElasticsearch Serviceの構築
- Elasticsearch Serviceへサンプルデータの投入
- KibanaのDev Toolsを利用してサンプルデータの検索方法
Elasticserch Serviceとは
Elasticserch Serviceのドメイン作成
Amazon Elasticsearch Serviceのドメインとは、Elasticsearchクラスターを意味しています。 クラスターはElasticsearch Serviceのインスタンスタイプ、インスタンス数(ノード数)、ストレージ容量などの設定を管理する単位です。
ドメイン作成作業自体は検証用に簡単な設定でコンソールからポチポチするだけなら3分もあれば終わります。Elasticserch Serviceが起動し利用できるまでは20分ほど待つことになります。
検証用ドメイン作成
Elasticserch Serviceの開きます。
任意のドメイン名を設定し、検証用にt3
シリーズのインスタンスとノード数を入力します。後々検証しているとサンプルデータ投入するとヘルスステータスが黄色になり、やたらと時間がかったのでキャプチャでは最初からノード数は2台指定しています。ちなみにそのときはノード数を後から追加して解決しました。
Amazon Elasticsearch Service の赤もしくは黄色の状態を解決する
クエリの検証用途ならパブリックアクセスで事足りるのでお手軽設定です。
パブリックアクセスなのでアクセス元のグローバルIPで制限しておきましょう。オフィスや、ご自宅のグローバルIPを入力してください。
20分ほど待ちます。
アクティブになるとElasticserch Serviceが利用可能です。
Elasticsearchで検索するまでの準備
なにかを検索したいので検索用のサンプルデータをElasticserch Serviceに投入したいです。
サンプルデータの登録
サンプルデータの読み込み | Kibanaユーザーガイド [5.4] | Elastic
Kibanaのユーザガイドからaccount.zip
をダウンロードしてサンプルデータを利用します。
unzip
で展開するとaccounts.json
のサンプルファイルが手に入ります。このJSONファイルをElasticserch Serviceに投入します。
サンプルデータ登録
curl
コマンドで展開したaccounts.json
ファイルをPOSTします。
Index Data - Open Distro for Elasticsearch Documentation
$ curl -H 'Content-Type: application/x-ndjson' -XPOST '[your-endpoint]/bank/account/_bulk?pretty' --data-binary @accounts.json
[your-endpoint]
はElasticserch Serviceのコンソール画面から確認できるエンドポイントの部分です。
index名一覧表示
index
名がbank
の項目が登録されていることを確認できました。
$ curl -XGET '[your-endpoint]/_cat/indices?v' health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open bank mbBKNCj-QOu5xkdybTT2Ew 5 1 1000 0 892.9kb 446.4kb green open .kibana_1 2mNkSNgAQRmD3IQg-b8_vg 1 1 14 4 93.1kb 46.7kb
Elasticserch Serviceのコンソール画面からもindex
名を確認できます。
KibanaのDev Toolsから検索
curl
コマンドだと入力が手間で検証するのがしんどくなりました。WEBブラウザから使えるKibanaのDev Toolsを使ってみます。
Elasticserch Serviceのコンソール画面からKibanaのURLをクリックします。
表示されたKibanaコンソールからDev Toolsをクリックします。
使い方はDev Toolsの左側に下記のコマンド貼り付けます。そして、真ん中の小さい実行ボタンを押します。すると右側に結果が表示されます。
index名一覧表示
さきほどcurl
コマンドでindex名を確認しましたが今度はDev Toolsでも試してみます。
GET _cat/indices?v&s=index
だいぶ使い勝手が良いです。
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open .kibana_1 2mNkSNgAQRmD3IQg-b8_vg 1 1 12 4 84.2kb 42.3kb green open bank mbBKNCj-QOu5xkdybTT2Ew 5 1 1000 0 892.9kb 446.4kb
ちなみに?v&s=index
をつけないで実行すると
GET /_cat/indices
ヘッダー行が表示されず初見では何の値が表示されているのかさっぱり分からなかったです。
green open bank mbBKNCj-QOu5xkdybTT2Ew 5 1 1000 0 892.9kb 446.4kb green open .kibana_1 2mNkSNgAQRmD3IQg-b8_vg 1 1 23 5 58.7kb 13.2kb
Dev Toolsを使うとcurlコマンドにオプションがごちゃごちゃしなくて見やすく検証しやすいことがわかりました。
Elasticserch Serviceで検索
本題のクエリを試せるようになりました。
indexのmapping確認
クエリの検証する前にサンプルデータにはどのようなフィールドがあるのか確認します。
GET [index]/_mapping
コマンドを使います。[index]
の部分は今回のサンプルデータはbank
という名前のindex名です。
GET bank/_mapping
{ "bank" : { "mappings" : { "properties" : { "account_number" : { "type" : "long" }, "address" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "age" : { "type" : "long" }, "balance" : { "type" : "long" }, "city" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "email" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "employer" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "firstname" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "gender" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "lastname" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "state" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } } } } } }
Math_all query
手始めに全件検索してみます。
GET bank/_search { "query": { "match_all": {} } }
出力結果はこんな感じです。画像だと文字読めないので以降は出力結果はテキストで紹介していきます。
size
指定で検索件数を調整できます。
GET bank/_search { "query": { "match_all": {} }, "size": 1 }
hits
数は1000件ありますがsize
の指定が1
なので検索件数は1件のみ表示されました。
{ "took" : 10, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1000, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "bank", "_type" : "account", "_id" : "13", "_score" : 1.0, "_source" : { "account_number" : 13, "balance" : 32838, "firstname" : "Nanette", "lastname" : "Bates", "age" : 28, "gender" : "F", "address" : "789 Madison Street", "employer" : "Quility", "email" : "[email protected]", "city" : "Nogal", "state" : "VA" } } ] } }
Match query
match
を使ってcity
がWilliston
に一致するものを検索しました。
Match query | Elasticsearch Reference [7.x] | Elastic
GET bank/_search { "query": { "match": { "city": { "query": "Williston" } } } }
{ "took" : 20, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 5.0064387, "hits" : [ { "_index" : "bank", "_type" : "account", "_id" : "359", "_score" : 5.0064387, "_source" : { "account_number" : 359, "balance" : 29927, "firstname" : "Vanessa", "lastname" : "Harvey", "age" : 28, "gender" : "F", "address" : "679 Rutledge Street", "employer" : "Zentime", "email" : "[email protected]", "city" : "Williston", "state" : "IL" } } ] } }
operator
オプションを使ってcity
がWilliston
かRushford
に一致するものを検索しました。
GET bank/_search { "query": { "match": { "city": { "query": "Williston Rushford", "operator": "or" } } } }
{ "took" : 54, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 5.0064387, "hits" : [ { "_index" : "bank", "_type" : "account", "_id" : "260", "_score" : 5.0064387, "_source" : { "account_number" : 260, "balance" : 2726, "firstname" : "Kari", "lastname" : "Skinner", "age" : 30, "gender" : "F", "address" : "735 Losee Terrace", "employer" : "Singavera", "email" : "[email protected]", "city" : "Rushford", "state" : "WV" } }, { "_index" : "bank", "_type" : "account", "_id" : "359", "_score" : 5.0064387, "_source" : { "account_number" : 359, "balance" : 29927, "firstname" : "Vanessa", "lastname" : "Harvey", "age" : 28, "gender" : "F", "address" : "679 Rutledge Street", "employer" : "Zentime", "email" : "[email protected]", "city" : "Williston", "state" : "IL" } } ] } }
Range query
range
を使って年齢が28歳以上、30歳以下を検索しました。
Range query | Elasticsearch Reference [7.x] | Elastic
GET bank/_search { "query": { "range": { "age": { "gte": 28, "lte": 30 } } } }
133件ヒットしたので2件目以降は省略しました。
{ "took" : 5, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 133, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "bank", "_type" : "account", "_id" : "13", "_score" : 1.0, "_source" : { "account_number" : 13, "balance" : 32838, "firstname" : "Nanette", "lastname" : "Bates", "age" : 28, "gender" : "F", "address" : "789 Madison Street", "employer" : "Quility", "email" : "[email protected]", "city" : "Nogal", "state" : "VA" } }, { "_index" : "bank", "_type" : "account", "_id" : "260", "_score" : 1.0, "_source" : { "account_number" : 260, "balance" : 2726, "firstname" : "Kari", "lastname" : "Skinner", "age" : 30, "gender" : "F", "address" : "735 Losee Terrace", "employer" : "Singavera", "email" : "[email protected]", "city" : "Rushford", "state" : "WV" } }, --- 省略 ---
おわりに
Elasticserch Serviceの起動待ちが長いですがクエリを投げて検証する環境はサンプルデータ投入も含め30分弱もあれば準備できそうです。Elasticserchのリファレンスを確認してクエリの使い方を調べ、実際に検索して試行錯誤すればクエリ検証の調査は可能となりました。リファレンス見ながらできるのかできないのか悩む時間でElasticserch Service起動できると思うので、とりあえず触ってみた方が理解が早かったです。
Elasticserch Serviceは停止して利用料金を削減することができません。検証時に停止できないことが難点になることもあるかもしれません。
料金 - Amazon Elasticsearch Service | AWS
本家Elasticserchの最新バージョンと比べるとElasticserch Serviceで利用できるElasticserchのバージョンは最新に追従していません。リファレンスを確認するときは念のため最新ではなく近しいバージョンを確認した方が無難でしょう。現時点ではElasticserch Referenceからリファレンスのバージョンを変更できます。
今後はどういったバージョンになるかはわかりませんが念のため。
Elastic 社による Elasticsearch および Kibana のライセンス変更にともなう AWS の対応方針のご案内 | Amazon Web Services ブログ